package vista;

import interfaces.IDibujable;
import interfaces.ILaberinto;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.util.HashMap;

import laberinto.Casilla;
import utilidades.Constantes;
import utilidades.Vector;

public class GraficosDelNivel implements IDibujable{
	private boolean modoDebug;
	private ILaberinto nivel;
	
	public GraficosDelNivel(ILaberinto nivel, boolean debugMode){
		this.modoDebug = debugMode;
		this.nivel = nivel;
	}	

	public void dibujar(Graphics grafico){
		if(modoDebug){
			HashMap<String, Casilla> casillas = nivel.getLaberinto();
			for (Casilla casilla : casillas.values()){
				dibujarCasilla(grafico,casilla);
			}
		}
	}

	public void dibujarCasilla(Graphics grafico, Casilla casilla){

		int anchoCasilla = Constantes.ANCHO_PANTALLA / nivel.obtenerCantidadColumnas(); 
		int altoCasilla = Constantes.ALTO_PANTALLA / nivel.obtenerCantidadFilas(); 
		
		Vector posicion = casilla.obtenerPosicion();

		int posX = posicion.obtenerCoordenadaX()*anchoCasilla + Constantes.OFFSET_CASILLAS_X;
		int posY = posicion.obtenerCoordenadaY()*altoCasilla + Constantes.OFFSET_CASILLAS_Y;
		
		Graphics2D grafico2D = (Graphics2D)grafico;
		grafico2D.setStroke(new BasicStroke(3));

		
		dibujarLinea(grafico2D,posX,posY,posX,posY,true);

		boolean hayDerecha = (casilla.obtenerDerecha().esOcupable());
		boolean hayIzquierda = (casilla.obtenerIzquierda().esOcupable());
		boolean hayArriba = (casilla.obtenerArriba().esOcupable());
		boolean hayAbajo = (casilla.obtenerAbajo().esOcupable());

		double offset = 2.5;
		dibujarLinea(grafico2D,(int)(posX-anchoCasilla/offset),(int)(posY+altoCasilla/offset),(int)(posX+anchoCasilla/offset),(int)(posY+altoCasilla/offset),hayDerecha);
		dibujarLinea(grafico2D,(int)(posX+anchoCasilla/offset),(int)(posY-altoCasilla/offset),(int)(posX+anchoCasilla/offset),(int)(posY+altoCasilla/offset),hayAbajo);
		dibujarLinea(grafico2D,(int)(posX-anchoCasilla/offset),(int)(posY-altoCasilla/offset),(int)(posX-anchoCasilla/offset),(int)(posY+altoCasilla/offset),hayArriba);
		dibujarLinea(grafico2D,(int)(posX-anchoCasilla/offset),(int)(posY-altoCasilla/offset),(int)(posX+anchoCasilla/offset),(int)(posY-altoCasilla/offset),hayIzquierda);
	}

	private void dibujarLinea(Graphics2D grafico2D,int x1,int y1, int x2, int y2,boolean puedePasar){
		
		if(puedePasar){
			grafico2D.setColor(new Color(0,255,0));
		}else{
			grafico2D.setColor(new Color(255,0,0));
		}
		grafico2D.draw(new Line2D.Float(x1,y1,x2,y2));
	}
	
	public void cambiarEstado(int stateIndex) {}	
}
